package com.atguigu.gmall.pms.service.impl;

import com.atguigu.gmall.pms.entity.SkuAttrValueEntity;
import com.atguigu.gmall.pms.entity.SkuImagesEntity;
import com.atguigu.gmall.pms.feign.SmsClient;
import com.atguigu.gmall.pms.service.SkuAttrValueService;
import com.atguigu.gmall.pms.service.SkuImagesService;
import com.atguigu.gmall.pms.vo.SkuVo;
import com.atguigu.gmall.pms.vo.SpuVo;
import com.atguigu.gmall.sms.dto.SkuSalesDto;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.atguigu.gmall.common.bean.PageResultVo;
import com.atguigu.gmall.common.bean.PageParamVo;

import com.atguigu.gmall.pms.mapper.SkuMapper;
import com.atguigu.gmall.pms.entity.SkuEntity;
import com.atguigu.gmall.pms.service.SkuService;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;


@Service("skuService")
public class SkuServiceImpl extends ServiceImpl<SkuMapper, SkuEntity> implements SkuService {
    @Autowired
    SkuImagesService skuImagesService;
    @Autowired
    SkuAttrValueService skuAttrValueService;
    @Autowired
    SmsClient smsClient;
    @Transactional
    public void saveSkus(SpuVo spuVo, Long spuId) {
        List<SkuVo> skus = spuVo.getSkus();
        if(CollectionUtils.isEmpty(skus)){
            return;
        }
        //4.1 保存sku数据
        //遍历分开保存，每保存一个sku数据，获取它的id  再关联它的图片列表 营销数据保存
        for (SkuVo skuVo : skus) {
            SkuEntity skuEntity = new SkuEntity();
            BeanUtils.copyProperties(skuVo,skuEntity);
            skuEntity.setSpuId(spuId);
            skuEntity.setBrandId(spuVo.getBrandId());
            skuEntity.setCategoryId(spuVo.getCategoryId());
            //获取图片列表的第一张当做默认图
            skuEntity.setDefaultImage(CollectionUtils.isEmpty(skuVo.getImages())?null:
                    skuVo.getImages().get(0));
            save(skuEntity);
            Long skuId = skuEntity.getId();
            //4.2 保存sku的图片列表
            List<String> images = skuVo.getImages();
            if(!CollectionUtils.isEmpty(images)){
                //将sku的图片地址集合转为 sku图片对象集合
                List<SkuImagesEntity> skuImagesEntities = images.stream().map(image -> {
                    SkuImagesEntity skuImagesEntity = new SkuImagesEntity();
                    skuImagesEntity.setSkuId(skuId);
                    skuImagesEntity.setUrl(image);
                    skuImagesEntity.setSort(0);
                    skuImagesEntity.setDefaultStatus(skuEntity.getDefaultImage()
                            .equals(image)?1:0);//1默认图  0不是
                    return skuImagesEntity;
                }).collect(Collectors.toList());
                skuImagesService.saveBatch(skuImagesEntities);

            }
            //4.3 保存sku的销售属性和值
            List<SkuAttrValueEntity> saleAttrs = skuVo.getSaleAttrs();
            //为所有的sku设置skuid
            saleAttrs.forEach(saleAttr->{
                saleAttr.setSkuId(skuId);
                saleAttr.setSort(0);
            });
            //java是引用地址传递
            skuAttrValueService.saveBatch(saleAttrs);
            //4.4 保存sku的营销数据：需要远程访问 sms服务
            SkuSalesDto skuSalesDto = new SkuSalesDto();
            BeanUtils.copyProperties(skuVo,skuSalesDto);
            skuSalesDto.setSkuId(skuId);
            smsClient.saveSkuSales(skuSalesDto);
        }
    }
    @Override
    public PageResultVo queryPage(PageParamVo paramVo) {
        IPage<SkuEntity> page = this.page(
                paramVo.getPage(),
                new QueryWrapper<SkuEntity>()
        );

        return new PageResultVo(page);
    }
    //重新更新商品价格的方法： 价格变动时 发送mq消息同步缓存价格

}